# 函数是组织好的，可重复使用的代码块，它可以让代码更加简洁，更加模块化，提高代码的可维护性。

# 定义函数
def my_function(x = 2):
    """
    这是一个简单的函数，它返回一个值。
    """
    return 3 * x + 1

# 调用函数
print(my_function(5)) # Output: 16
print(my_function()) # Output: 7

# 定义函数时，可以给函数添加参数，参数可以是位置参数、默认参数、可变参数、关键字参数和命名关键字参数。
# 位置参数：必选参数，必须按照函数定义中的顺序传入函数。
# 默认参数：可选参数，如果没有传入值，则使用默认值。
# 可变参数：参数个数不确定，可以传入0个或多个值，会被组装成一个tuple。

def getArea(width, height = 10):
    """
    计算矩形的面积
    """
    return width * height

# 调用函数
print(getArea(5)) # Output: 50
print(getArea(5, 8)) # Output: 40
print(getArea(height=8, width=3)) # Output: 24

# 匿名函数：lambda表达式，可以创建匿名函数，可以简化代码。

# 定义匿名函数
add = lambda x, y: x + y
# 调用匿名函数
print(add(2, 3)) # Output: 5

# 强制位置参数
# a,b必须使用指定的位置参数，c,d可以使用位置形参或关键字形参，e,f必须使用关键字参数。
def my_function(a, b, /, c, d, *, e, f):
    return a + b + c + d + e + f

# 调用函数
print(my_function(1, 2, 3, 4, e=5, f=6)) # Output: 21